/*!
 * \file WtUftTicker.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief UFT实时行情处理器定义文件
 * 
 * \details 定义了UFT(Ultra Fast Trading)实时行情处理器类，负责处理超高频交易
 *          环境下的实时行情数据。该模块专门优化了高频数据处理的性能，提供
 *          精确的时间控制和行情分发机制。
 */
#pragma once

#include <stdint.h>
#include <atomic>

#include "../Includes/WTSMarcos.h"
#include "../Share/StdUtils.hpp"

NS_WTP_BEGIN
class WTSSessionInfo;
class WTSTickData;

class WtUftEngine;

/*!
 * \class WtUftRtTicker
 * \brief UFT实时行情处理器类
 * 
 * \details UFT实时行情处理器，专门用于超高频交易环境下的实时行情处理。
 *          主要功能包括：
 *          - 高性能的实时Tick数据处理和分发
 *          - 基于交易时段的精确时间控制
 *          - 原子操作确保线程安全的高频数据处理
 *          - 独立线程运行，避免阻塞主线程
 *          - 支持亚毫秒级的行情延迟控制
 *          - 自动处理交易时段切换和状态管理
 * 
 * \note 该类针对超高频交易场景进行了特殊优化，确保极低延迟
 * \warning 所有时间相关操作都是高精度的，需要确保系统时钟同步
 */
class WtUftRtTicker
{
public:
	/*!
	 * \brief 构造函数
	 * \param engine UFT引擎指针
	 * 
	 * \details 初始化UFT实时行情处理器，建立与UFT引擎的关联关系
	 */
	WtUftRtTicker(WtUftEngine* engine);
	
	/*!
	 * \brief 析构函数
	 * 
	 * \details 清理实时行情处理器资源，停止处理线程并释放相关资源
	 */
	~WtUftRtTicker();

public:
	/*!
	 * \brief 初始化行情处理器
	 * \param sessionID 交易时段ID
	 * 
	 * \details 根据指定的交易时段ID初始化行情处理器，设置时段信息和相关参数。
	 *          这是启动行情处理器前的必要步骤。
	 */
	void	init(const char* sessionID);
	
	/*!
	 * \brief 处理实时Tick数据
	 * \param curTick 当前Tick数据指针
	 * 
	 * \details 接收并处理实时Tick数据，更新内部状态并触发相应的处理逻辑。
	 *          该方法经过高度优化，确保极低的处理延迟。
	 */
	void	on_tick(WTSTickData* curTick);

	/*!
	 * \brief 启动行情处理器
	 * 
	 * \details 启动独立的处理线程，开始实时行情数据的处理和分发。
	 *          线程将持续运行直到调用stop()方法。
	 */
	void	run();
	
	/*!
	 * \brief 停止行情处理器
	 * 
	 * \details 停止行情处理线程，等待线程安全退出。
	 *          调用此方法后，行情处理器将停止所有处理活动。
	 */
	void	stop();

private:
	WTSSessionInfo*	_s_info;		///< 交易时段信息指针，包含交易时间规则
	WtUftEngine*	_engine;		///< UFT引擎指针，用于回调处理结果

	uint32_t	_date;				///< 当前交易日期（格式：YYYYMMDD）
	uint32_t	_time;				///< 当前交易时间（格式：HHMMSSsss）

	uint32_t	_cur_pos;			///< 当前处理位置标记

	StdUniqueMutex	_mtx;			///< 互斥锁，保护共享数据的线程安全
	std::atomic<uint64_t>	_next_check_time;	///< 原子操作：下次检查时间，确保高频访问的线程安全
	std::atomic<uint32_t>	_last_emit_pos;		///< 原子操作：最后发送位置，用于状态同步

	bool			_stopped;		///< 停止标志，控制处理线程的生命周期
	StdThreadPtr	_thrd;			///< 处理线程指针，独立运行行情处理逻辑
};

NS_WTP_END